package com.hqyj.server.util;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.digest.DigestAlgorithm;
import cn.hutool.crypto.digest.Digester;
import org.mindrot.jbcrypt.BCrypt;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Component
public class MyUtil {


    // private static String md5Salt; //M5摘要加密使用的盐。采用MD5+盐，对用户的密码进行加密。



    private String salt;

    private static String mySalt;

    @Value("${myproject.my-salt}")
    public void setSalt(String salt){
        //this.salt = salt;
        MyUtil.mySalt = salt;
    }

    //检查是否是合法的手机号码
    public static boolean isMobileNumber(String mobileStr) {
        Pattern p = Pattern.compile("^((13[0-9])|(15[^4])|(18[0-9])|(17[0-9])|(19[0-9])|(147))\\d{8}$");
        Matcher m = p.matcher(mobileStr);
        return m.matches();
    }

    public static boolean isEmail(String email) {
        // return ReUtil.isMatch("^(\\w+([-.][A-Za-z0-9]+)*){3,18}@\\w+([-.][A-Za-z0-9]+)*\\.\\w+([-.][A-Za-z0-9]+)*$",email);
        //正则表达式匹配任何字符
        String regex = "^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$";
        //编译正则表达式
        Pattern pattern = Pattern.compile(regex);
        //检索匹配器对象
        Matcher m = pattern.matcher(email);
        return m.matches();
    }

    //随机生成一个用户名
    public static String generateRandomUsername() {
        return IdUtil.simpleUUID();
    }

    //使用MD5+盐的摘要算法对注册用户的密码进行摘要加密

    public static String encodePasswordByMd5Salt(String password) throws Exception{
        Digester md5 = new Digester(DigestAlgorithm.MD5);
        //给MD5添加了盐
        System.out.println("您使用的盐是：" + MyUtil.mySalt);
        md5.setSalt(mySalt.getBytes("utf-8"));
        return md5.digestHex(password);
    }


    public static void main(String[] args) throws Exception {

        //String password = "123456";
        //摘要算法。
        //MD5, 任意一段明文---》长度大小固定的密文，只要明文相同---》密文一定相同。
        //不可逆。
        /*
        String content = "八一建军节来临之际，习近平26日到西部战区空军视察，代表党中央和中央军委，向全体人民解放军指战员、武警部队官兵、军队文职人员，民兵预备役人员致以节日祝贺 。他强调，加快提高部队现代化水平，坚决完成党和人民赋予的各项任务。\n" +
                "\n" +
                "　　26日下午，习近平来到三星堆博物馆新馆，了解三星堆遗址发掘历程和古蜀文明成果。在三星堆博物馆文物保护与修复馆，他仔细察看文物保护修复工作流程细节和最新技术，同现场工作人员亲切交流。\n" +
                "\n" +
                "　　27日上午，习近平听取了四川省委和省政府工作汇报，他强调，推动新时代治蜀兴川再上新台阶，奋力谱写中国式现代化四川新篇章。";

        //String content = "吃了吗?";
        */


        String password1 = "123456";
        String password2 = "123456";

        String encodePass1 = SecureUtil.md5(password1);
        String encodePass2 = SecureUtil.md5(password2);

        System.out.println(encodePass1);
        System.out.println(encodePass2);

        System.out.println("--------------md5----------------");
        /*
        String password = "123456";
        String encodePass = MyUtil.encodePasswordByMd5Salt(password);
        System.out.println(encodePass);*/


        // 加密
        String encodedPassword = BCrypt.hashpw(password1, BCrypt.gensalt());
        System.out.println("password 的密文：" +encodedPassword);

        // 使用正确密码验证密码是否正确
        boolean flag = BCrypt.checkpw(password1, encodedPassword);
        System.out.println(flag);

        // 使用错误密码验证密码是否正确
        flag = BCrypt.checkpw("111222", encodedPassword);
        System.out.println(flag);

        System.out.println("-------------------对相同密码再次加密------------------------");

        //相同密文再次加密
        encodedPassword = BCrypt.hashpw(password2, BCrypt.gensalt());
        System.out.println("password 再次加密的密文：" +encodedPassword);
    }
}


